package pe.com.hermes.hermetic.modelo.daoimpl;

import com.ibatis.sqlmap.client.SqlMapClient;

import java.util.Collections;

import pe.com.hermes.hermetic.beans.ConfBean;
import pe.com.hermes.hermetic.beans.ConsolidadoBean;
import pe.com.hermes.hermetic.beans.FaltSobrFechaBean;
import pe.com.hermes.hermetic.beans.FaltSobrTCCBean;
import pe.com.hermes.hermetic.beans.SaldoTempBean;
import pe.com.hermes.hermetic.beans.TiposBean;
import pe.com.hermes.hermetic.modelo.dao.ReportesDAO;
import pe.com.hermes.hermetic.negocio.ultil.CadenaUtil;
import pe.com.hermes.hermetic.negocio.ultil.ConstantesHermetic;

import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import java.util.Map;

import oracle.jdbc.OracleTypes;

import org.apache.log4j.Logger;

import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.CallableStatementCallback;
import org.springframework.jdbc.core.JdbcTemplate;

import pe.com.hermes.hermetic.negocio.service.TablService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import pe.com.hermes.hermetic.beans.ComprobanteServicioBean;

@Repository("reportesDAO")
public class ReportesDAOImpl implements ReportesDAO{
    private Logger logger = Logger.getLogger(this.getClass());
    @Autowired
    protected JdbcTemplate jdbcTemplate;
    @Autowired
    private SqlMapClient sqlMapClient;    


    ReportesDAO reportesDAO;
    public ReportesDAOImpl() {
    }    
    public ConsolidadoBean getSaldoConsolidado(final String cod_sucu_htb,final String fecha){
        logger.info("obtiene saldo consolidado");
        String SQL = 
            "{ call APERTURA.HWPG_CNTA.HWPR_RETU_SHOW_LIST(?,?,?,?,?,?,?,?,?) }";
        final List listResult = new ArrayList();
        final ConsolidadoBean consolidadoBean = new ConsolidadoBean();
        CadenaUtil.logSQL(this.getClass(),new Exception().getStackTrace()[0].getMethodName(),SQL);
        CallableStatementCallback cs = new CallableStatementCallback() {
                public Object doInCallableStatement(CallableStatement arg0) throws DataAccessException, 
                                                                                   SQLException {
                    arg0.setString(1, cod_sucu_htb);
                    arg0.setString(2, fecha);
                    arg0.registerOutParameter(3, OracleTypes.CURSOR);
                    arg0.registerOutParameter(4, OracleTypes.CURSOR);
                    arg0.registerOutParameter(5, OracleTypes.CURSOR);
                    arg0.registerOutParameter(6, OracleTypes.CURSOR);
                    arg0.registerOutParameter(7, OracleTypes.CURSOR);
                    arg0.registerOutParameter(8, OracleTypes.CURSOR);
                    arg0.registerOutParameter(9, OracleTypes.VARCHAR);
                    arg0.execute();
                    ResultSet rs1 = (ResultSet)arg0.getObject(3);
                    ResultSet rs2 = (ResultSet)arg0.getObject(4);
                    ResultSet rs3 = (ResultSet)arg0.getObject(5);
                    ResultSet rs4 = (ResultSet)arg0.getObject(6);
                    ResultSet rs5 = (ResultSet)arg0.getObject(7);
                    ResultSet rs6 = (ResultSet)arg0.getObject(8);
                    while (rs1.next()) {
                        SaldoTempBean saldoTemp= new SaldoTempBean();
                        saldoTemp.setTipo_reporte(rs1.getString(1));
                        saldoTemp.setTipo_moneda(rs1.getInt(2));
                        saldoTemp.setTipo_deno(rs1.getString(3));
                        saldoTemp.setMonto_movimiento(rs1.getDouble(4));
                        saldoTemp.setMonto_limpios(rs1.getDouble(5));
                        saldoTemp.setMonto_deteriorado(rs1.getDouble(6));
                        saldoTemp.setMonto_atm(rs1.getDouble(7));
                        saldoTemp.setMonto_cb(rs1.getDouble(8));
                        saldoTemp.setMonto_cb_dudoso(rs1.getDouble(9));
                        saldoTemp.setTotal(rs1.getDouble(10));
                        listResult.add(saldoTemp);
                    }
                    while (rs2.next()) {
                        SaldoTempBean saldoTemp= new SaldoTempBean();
                        saldoTemp.setTipo_reporte(rs1.getString(1));
                        saldoTemp.setTipo_moneda(rs1.getInt(2));
                        saldoTemp.setTipo_deno(rs1.getString(3));
                        saldoTemp.setMonto_movimiento(rs1.getDouble(4));
                        saldoTemp.setMonto_limpios(rs1.getDouble(5));
                        saldoTemp.setMonto_deteriorado(rs1.getDouble(6));
                        saldoTemp.setMonto_atm(rs1.getDouble(7));
                        saldoTemp.setMonto_cb(rs1.getDouble(8));
                        saldoTemp.setMonto_cb_dudoso(rs1.getDouble(9));
                        saldoTemp.setTotal(rs1.getDouble(10));
                        listResult.add(saldoTemp);
                    }
                    while (rs3.next()) {
                        SaldoTempBean saldoTemp= new SaldoTempBean();
                        saldoTemp.setTipo_reporte(rs1.getString(1));
                        saldoTemp.setTipo_moneda(rs1.getInt(2));
                        saldoTemp.setTipo_deno(rs1.getString(3));
                        saldoTemp.setMonto_movimiento(rs1.getDouble(4));
                        saldoTemp.setMonto_limpios(rs1.getDouble(5));
                        saldoTemp.setMonto_deteriorado(rs1.getDouble(6));
                        saldoTemp.setMonto_atm(rs1.getDouble(7));
                        saldoTemp.setMonto_cb(rs1.getDouble(8));
                        saldoTemp.setMonto_cb_dudoso(rs1.getDouble(9));
                        saldoTemp.setTotal(rs1.getDouble(10));
                        listResult.add(saldoTemp);
                    }
                    while (rs4.next()) {
                        SaldoTempBean saldoTemp= new SaldoTempBean();
                        saldoTemp.setTipo_reporte(rs1.getString(1));
                        saldoTemp.setTipo_moneda(rs1.getInt(2));
                        saldoTemp.setTipo_deno(rs1.getString(3));
                        saldoTemp.setMonto_movimiento(rs1.getDouble(4));
                        saldoTemp.setMonto_limpios(rs1.getDouble(5));
                        saldoTemp.setMonto_deteriorado(rs1.getDouble(6));
                        saldoTemp.setMonto_atm(rs1.getDouble(7));
                        saldoTemp.setMonto_cb(rs1.getDouble(8));
                        saldoTemp.setMonto_cb_dudoso(rs1.getDouble(9));
                        saldoTemp.setTotal(rs1.getDouble(10));
                        listResult.add(saldoTemp);
                    }
                    while (rs5.next()) {
                        SaldoTempBean saldoTemp= new SaldoTempBean();
                        saldoTemp.setTipo_reporte(rs1.getString(1));
                        saldoTemp.setTipo_moneda(rs1.getInt(2));
                        saldoTemp.setTipo_deno(rs1.getString(3));
                        saldoTemp.setMonto_movimiento(rs1.getDouble(4));
                        saldoTemp.setMonto_limpios(rs1.getDouble(5));
                        saldoTemp.setMonto_deteriorado(rs1.getDouble(6));
                        saldoTemp.setMonto_atm(rs1.getDouble(7));
                        saldoTemp.setMonto_cb(rs1.getDouble(8));
                        saldoTemp.setMonto_cb_dudoso(rs1.getDouble(9));
                        saldoTemp.setTotal(rs1.getDouble(10));
                        listResult.add(saldoTemp);
                    }
                    while (rs6.next()) {
                        SaldoTempBean saldoTemp= new SaldoTempBean();
                        saldoTemp.setTipo_reporte(rs1.getString(1));
                        saldoTemp.setTipo_moneda(rs1.getInt(2));
                        saldoTemp.setTipo_deno(rs1.getString(3));
                        saldoTemp.setMonto_movimiento(rs1.getDouble(4));
                        saldoTemp.setMonto_limpios(rs1.getDouble(5));
                        saldoTemp.setMonto_deteriorado(rs1.getDouble(6));
                        saldoTemp.setMonto_atm(rs1.getDouble(7));
                        saldoTemp.setMonto_cb(rs1.getDouble(8));
                        saldoTemp.setMonto_cb_dudoso(rs1.getDouble(9));
                        saldoTemp.setTotal(rs1.getDouble(10));
                        listResult.add(saldoTemp);
                    }
                    return consolidadoBean;
                }
            };
        this.jdbcTemplate.execute(SQL, cs);

        return consolidadoBean;
    }
    
    public List getTiposReporte(String formulario){
            List listaReportes = new ArrayList();
            TiposBean beanReportes = new TiposBean();
            beanReportes.setCodigo(ConstantesHermetic.CTE_REPORTE_TODOS);
            beanReportes.setDescripcion(ConstantesHermetic.REPORTE_TODOS);
            listaReportes.add(beanReportes);
            beanReportes = new TiposBean();
            beanReportes.setCodigo(ConstantesHermetic.CTE_REPORTE_PRE_CIERRE);
            beanReportes.setDescripcion(ConstantesHermetic.REPORTE_CONSULTA_SALDOS);
            listaReportes.add(beanReportes);
            beanReportes = new TiposBean();
            beanReportes.setCodigo(ConstantesHermetic.CTE_REPORTE_REMESAS_PROCESAR);
            beanReportes.setDescripcion(ConstantesHermetic.REPORTE_REMESAS_PROCESAR);
            listaReportes.add(beanReportes);
            beanReportes = new TiposBean();
            beanReportes.setCodigo(ConstantesHermetic.CTE_REPORTE_INGRESO_REMESAS);
            beanReportes.setDescripcion(ConstantesHermetic.REPORTE_INGRESO_REMESAS);
            listaReportes.add(beanReportes);
            beanReportes = new TiposBean();
            beanReportes.setCodigo(ConstantesHermetic.CTE_REPORTE_ATENCIO_REMESAS);
            beanReportes.setDescripcion(ConstantesHermetic.REPORTE_ATENCIO_REMESAS);
            listaReportes.add(beanReportes);
            /*JRA 25/07/11 Agregado Reporte Consolidado de Cuadre Diario*/
            beanReportes = new TiposBean();
            beanReportes.setCodigo(ConstantesHermetic.CTE_REPORTE_CUADRE_DIARIO);
            beanReportes.setDescripcion(ConstantesHermetic.REPORTE_CUADRE_DIARIO);
            listaReportes.add(beanReportes);
            
            return listaReportes;
        }
    
    public List getTiposReporteExistNum(String formulario){
            List listaReportes = new ArrayList();
            TiposBean beanReportes = new TiposBean();
            beanReportes.setCodigo(ConstantesHermetic.CTE_REPORTE_TODOS);
            beanReportes.setDescripcion(ConstantesHermetic.REPORTE_TODOS);
            listaReportes.add(beanReportes);
            beanReportes = new TiposBean();
            beanReportes.setCodigo(ConstantesHermetic.CTE_REPORTE_PRE_CIERRE);
            beanReportes.setDescripcion(ConstantesHermetic.REPORTE_CONSULTA_SALDOS);
            listaReportes.add(beanReportes);
            beanReportes = new TiposBean();
            beanReportes.setCodigo(ConstantesHermetic.CTE_REPORTE_REMESAS_PROCESAR);
            beanReportes.setDescripcion(ConstantesHermetic.REPORTE_REMESAS_PROCESAR);
            listaReportes.add(beanReportes);
            beanReportes = new TiposBean();
            beanReportes.setCodigo(ConstantesHermetic.CTE_REPORTE_INGRESO_REMESAS);
            beanReportes.setDescripcion(ConstantesHermetic.REPORTE_INGRESO_REMESAS);
            listaReportes.add(beanReportes);
            beanReportes = new TiposBean();
            beanReportes.setCodigo(ConstantesHermetic.CTE_REPORTE_ATENCIO_REMESAS);
            beanReportes.setDescripcion(ConstantesHermetic.REPORTE_ATENCIO_REMESAS);
            listaReportes.add(beanReportes);

              beanReportes = new TiposBean();
              beanReportes.setCodigo(ConstantesHermetic.CTE_REPORTE_EXIST_NUMER);
              beanReportes.setDescripcion(ConstantesHermetic.REPORTE_EXIST_NUMER);
              listaReportes.add(beanReportes);

            /*JRA 25/07/11 Agregado Reporte Consolidado de Cuadre Diario*/
            beanReportes = new TiposBean();
            beanReportes.setCodigo(ConstantesHermetic.CTE_REPORTE_CUADRE_DIARIO);
            beanReportes.setDescripcion(ConstantesHermetic.REPORTE_CUADRE_DIARIO);
            listaReportes.add(beanReportes);
            
            return listaReportes;
        }
    
    public String validarCompSalida(String codCliente, String tipoReporte) {
      Map map = new HashMap();
      map.put("P_COD_CLIE",codCliente);
      map.put("P_TIP_REPO",tipoReporte);
      String indActi="";
      try{
          sqlMapClient.queryForObject("validarCompSalida",map);
          indActi=(String)map.get("S_IND_ACT");
      }catch(Exception e){
         logger.error(e);
      }
      return indActi;
    }
    
    public Boolean getPendXProcesar(String codCliente, String sucursal,
                                    String tipoReporte, String fechadesde,
                                    String fechahasta,String tipClie,String tipoFecha) {
      Map map = new HashMap();
      map.put("P_COD_CLIE",codCliente);
      map.put("P_COD_SUCU",sucursal);
      map.put("P_TIP_REPO",tipoReporte);
      map.put("P_FEC_INI",fechadesde);
      map.put("P_FEC_FIN",fechahasta);
      map.put("P_TIP_CLIE",tipClie);
      map.put("P_TIP_FECH",tipoFecha);
      Boolean rpta=false;
      String result = "";
      try{
          sqlMapClient.queryForObject("getPendXProcesar",map);
          result=(String)map.get("S_EXITO");
      }catch(Exception e){
         logger.error(e);
      }
      logger.info("y la respuesta es "+result);
      if(result.equals("1"))rpta=true;
      return rpta;
    }
    
    public List genRepCompServPendProc(String tipoReporte,
                                       String listCodSucurs, String fechaDesde,
                                       String fechaHasta, String listCodClie,
                                       String listPuntosCadena,
                                       String listBancosCadena,
                                       String listCodCtaCadena, String tipClie,String tipoFecha,String uniMone) {
      Map map = new HashMap();                          
      map.put("P_TIP_REPO",tipoReporte);
      map.put("P_COD_SUCU",listCodSucurs);
      map.put("P_FEC_INI",fechaDesde);
      map.put("P_FEC_FIN",fechaHasta);
      map.put("P_COD_CLIE",listCodClie);
      map.put("P_COD_PUNT",listPuntosCadena);
      map.put("P_COD_BANC",listBancosCadena);
      map.put("P_COD_CNTA",listCodCtaCadena);
      map.put("P_TIP_CLIE",tipClie);
      map.put("P_TIP_FECH",tipoFecha);
      map.put("P_UNI_MONE",uniMone);
      
      List lista = new ArrayList();
      int erro = 0;
      try{
          sqlMapClient.queryForObject("getRepCompServPendProc",map);
          erro=(Integer)map.get("S_ERRO");
          if(erro==0)
              lista = (List)map.get("S_LIST");
          else
              throw new Exception((String)map.get("S_MENS"));
      }catch(Exception e){
          logger.error(e);
          e.printStackTrace();
          lista = new ArrayList();
      }
      return lista;
    }
    
   public List<ComprobanteServicioBean> getListCompServNorm(String codClientes, String codSucursales, 
                                                            String codBancos,String codCuentas,String codPuntos, 
                                                            int tipClie, String fecDesde, String fecHasta,String tipoFecha,String uniMone){
     
     Map map = new HashMap();                          
     map.put("P_COD_CLIE",codClientes);
     map.put("P_LIST_COD_SUCU",codSucursales);
     map.put("P_LIST_COD_BANC",codBancos);
     map.put("P_LIST_COD_CNTA",codCuentas);
     map.put("P_LIST_COD_PUNT",codPuntos);
     map.put("P_TIP_CLIE",tipClie);
     map.put("P_FECH_DESD",fecDesde);
     map.put("P_FECH_HAST",fecHasta);
     map.put("P_TIP_FECH",tipoFecha);
     map.put("P_UNI_MONE",uniMone);
     
     List listaCompServ = new ArrayList();
     int erro = 0;
     try{
         sqlMapClient.queryForObject("getListCmpbServNorm",map);
         erro=(Integer)map.get("S_ERRO");
         if(erro==0)
             listaCompServ = (List<ComprobanteServicioBean>)map.get("S_LIST");
         else
             throw new Exception((String)map.get("S_MENS"));
     }catch(Exception e){
         logger.error(e);
         e.printStackTrace();
         listaCompServ = new ArrayList();
     }
     return listaCompServ;
        
   }

    public List genRepSobrDetPendProc(String listCodSucurs, String fechaDesde,
                                      String fechaHasta, String listCodClie,
                                      String listPuntosCadena,
                                      String listBancosCadena,
                                      String listCodCtaCadena,String tipoFecha,String uniMone) {
      Map map = new HashMap();                          
      map.put("P_COD_SUCU",listCodSucurs);
      map.put("P_FEC_INI",fechaDesde);
      map.put("P_FEC_FIN",fechaHasta);
      map.put("P_COD_CLIE",listCodClie);
      map.put("P_COD_PUNT",listPuntosCadena);
      map.put("P_COD_BANC",listBancosCadena);
      map.put("P_COD_CNTA",listCodCtaCadena);
      map.put("P_TIP_FECH",tipoFecha);
      map.put("P_UNI_MONE",uniMone);
      
      List lista = new ArrayList();
      int erro = 0;
      try{
          sqlMapClient.queryForObject("genRepSobrDetPendProc",map);
          erro=(Integer)map.get("S_ERRO");
          if(erro==0)
              lista = (List)map.get("S_LIST");
          else
              throw new Exception((String)map.get("S_MENS"));
      }catch(Exception e){
          logger.error(e);
          e.printStackTrace();
          lista = new ArrayList();
      }
      return lista;
    }
    
    

  public List genRepSobrDetPendProcTxt(String listCodSucurs, String fechaDesde,
                                    String fechaHasta, String listCodClie,
                                    String listPuntosCadena,
                                    String listBancosCadena,
                                    String listCodCtaCadena,String tipoFecha,String uniMone) {
    Map map = new HashMap();                          
    map.put("P_COD_SUCU",listCodSucurs);
    map.put("P_FEC_INI",fechaDesde);
    map.put("P_FEC_FIN",fechaHasta);
    map.put("P_COD_CLIE",listCodClie);
    map.put("P_COD_PUNT",listPuntosCadena);
    map.put("P_COD_BANC",listBancosCadena);
    map.put("P_COD_CNTA",listCodCtaCadena);
    map.put("P_TIP_FECH",tipoFecha);
    map.put("P_UNI_MONE",uniMone);
    
    List lista = new ArrayList();
    int erro = 0;
    try{
        sqlMapClient.queryForObject("genRepSobrDetPendProcTxt",map);
        erro=(Integer)map.get("S_ERRO");
        if(erro==0)
            lista = (List)map.get("S_LIST");
        else
            throw new Exception((String)map.get("S_MENS"));
    }catch(Exception e){
        logger.error(e);
        e.printStackTrace();
        lista = new ArrayList();
    }
    return lista;
  }

  public List<FaltSobrFechaBean> getListSobrFecha(String codClientes,
                                                    String codSucursales,
                                                    String codBancos,
                                                    String codCuentas,
                                                    String codPuntos,
                                                    String fecDesde,
                                                    String fecHasta,String tipoFecha,String uniMone) {
      Map map = new HashMap();                          
      map.put("P_COD_SUCU",codSucursales);
      map.put("P_FEC_INI",fecDesde);
      map.put("P_FEC_FIN",fecHasta);
      map.put("P_COD_CLIE",codClientes);
      map.put("P_COD_PUNT",codPuntos);
      map.put("P_COD_BANC",codBancos);
      map.put("P_COD_CNTA",codCuentas);
      map.put("P_TIP_FECH",tipoFecha);
      map.put("P_UNI_MONE",uniMone);
      
      List lista = new ArrayList();
      int erro = 0;
      try{
          sqlMapClient.queryForObject("getListSobrFecha",map);
          erro=(Integer)map.get("S_ERRO");
          if(erro==0)
              lista = (List)map.get("S_LIST");
          else
              throw new Exception((String)map.get("S_MENS"));
      }catch(Exception e){
          logger.error("el error es = "+e);
          e.printStackTrace();
          lista = new ArrayList();
      }
      return lista;
    }

    public List<FaltSobrTCCBean> getListTCC(String listCodClie,
                                                 String listCodSucurs,
                                                 String listBancosCadena,
                                                 String listCodCtaCadena,
                                                 String listPuntosCadena,
                                                 String fecDesde,
                                                 String fecHasta,
                                                 String tipoFecha,String uniMone) {
      Map map = new HashMap();
      map.put("P_COD_SUCU",listCodSucurs);
      map.put("P_FEC_INI",fecDesde);
      map.put("P_FEC_FIN",fecHasta);
      map.put("P_COD_CLIE",listCodClie);
      map.put("P_COD_PUNT",listPuntosCadena);
      map.put("P_COD_BANC",listBancosCadena);
      map.put("P_COD_CNTA",listCodCtaCadena);
      map.put("P_TIP_FECH",tipoFecha);
      map.put("P_UNI_MONE",uniMone);
      
      List lista = new ArrayList();
      int erro = 0;
      try{
          sqlMapClient.queryForObject("getListTCC",map);
          erro=(Integer)map.get("S_ERRO");
          if(erro==0)
              lista = (List)map.get("S_LIST");
          else
              throw new Exception((String)map.get("S_MENS"));
      }catch(Exception e){
          logger.error("el error es = "+e);
          e.printStackTrace();
          lista = new ArrayList();
      }
      return lista;
    }
}
